package com.jason.fingerprint.logic;

import android.util.Log;

import com.jason.fingerprint.common.UIHelper;

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.ConnectException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.ProtocolException;
import java.net.SocketTimeoutException;
import java.net.URL;
import java.util.Map;

public class PostFile extends Thread {

	private static CallBack callBack;
	private static String action;
	private static Map<String ,String> params;
	private static Map<String ,File> fileParams;

	@Override
	public void run() {
		postFile(action, params, fileParams);
	}

	public interface CallBack{

		void onSuccess(Object object);

		void onFailure(int arg1, String arg2);
	}

	public PostFile(String action,Map<String ,String> params,Map<String ,File> fileParams,CallBack back){
		this.callBack = back;
		this.action = action;
		this.params = params;
		this.fileParams = fileParams;
	}

	public void Post(){

		/*try {
			callBack.onSuccess(postFile(action, params, fileParams));
		} catch (IOException e) {
			callBack.onFailure(1,e.getMessage());
		}*/
	}
	
	/**
	 * ͨ通过拼接的方式构造请求内容，实现参数传输以及文件传输
	 * 
	 * @param actionUrl
	 * @param params
	 * @param files
	 * @return
	 * @throws java.io.IOException
	 */
	public static String post(String actionUrl, Map<String, String> params,
			Map<String, File> files) throws IOException {
		String BOUNDARY = java.util.UUID.randomUUID().toString();
		String PREFIX = "--", LINEND = "\r\n";
		String MULTIPART_FROM_DATA = "multipart/form-data";
		String CHARSET = "UTF-8";
		URL uri = new URL(actionUrl);
		HttpURLConnection conn = (HttpURLConnection) uri.openConnection();
		conn.setReadTimeout(20 * 1000); // 缓存的最长时间
		conn.setDoInput(true);// 允许输入
		conn.setDoOutput(true);// 允许输出
		conn.setUseCaches(false); // 不允许使用缓存
		conn.setRequestMethod("POST");
		conn.setRequestProperty("connection", "keep-alive");
		conn.setRequestProperty("Charsert", "UTF-8");
		conn.setRequestProperty("Content-Type", MULTIPART_FROM_DATA
				+ ";boundary=" + BOUNDARY);
		// 首先组拼文本类型的参数
		StringBuilder sb = new StringBuilder();
		for (Map.Entry<String, String> entry : params.entrySet()) {
			sb.append(PREFIX);
			sb.append(BOUNDARY);
			sb.append(LINEND);
			sb.append("Content-Disposition: form-data; name=\""
					+ entry.getKey() + "\"" + LINEND);
			sb.append("Content-Type: text/plain; charset=" + CHARSET + LINEND);
			sb.append("Content-Transfer-Encoding: 8bit" + LINEND);
			sb.append(LINEND);
			sb.append(entry.getValue());
			sb.append(LINEND);
		}
		DataOutputStream outStream = new DataOutputStream(
				conn.getOutputStream());
		outStream.write(sb.toString().getBytes());
		// 发送文件数据
		if (files != null)
			for (Map.Entry<String, File> file : files.entrySet()) {
				StringBuilder sb1 = new StringBuilder();
				sb1.append(PREFIX);
				sb1.append(BOUNDARY);
				sb1.append(LINEND);
				sb1.append("Content-Disposition: form-data; name=\"file\"; filename=\""
						+ file.getKey() + "\"" + LINEND);
				sb1.append("Content-Type: application/octet-stream; charset="
						+ CHARSET + LINEND);
				sb1.append(LINEND);
				outStream.write(sb1.toString().getBytes());
				InputStream is = new FileInputStream(file.getValue());
				byte[] buffer = new byte[1024];
				int len = 0;
				while ((len = is.read(buffer)) != -1) {
					outStream.write(buffer, 0, len);
				}
				is.close();
				outStream.write(LINEND.getBytes());
			}
		// 请求结束标志־
		byte[] end_data = (PREFIX + BOUNDARY + PREFIX + LINEND).getBytes();
		outStream.write(end_data);
		outStream.flush();
		// 得到响应码
		int res = conn.getResponseCode();
		InputStream in = null;
		if (res == 200) {
			in = conn.getInputStream();
			int ch;
			StringBuilder sb2 = new StringBuilder();
			while ((ch = in.read()) != -1) {
				sb2.append((char) ch);
			}
		}
		outStream.close();
		conn.disconnect();
		return in.toString();
	}

	/**
	 * ͨ通过拼接的方式构造请求内容，实现参数传输以及文件传输
	 * 
	 * @param actionUrl
	 * @param params
	 * @param files
	 * @return 返回上传到服务端的相对路径
	 * @throws java.io.IOException
	 */
	public static void postFile(String actionUrl, Map<String, String> params,
			Map<String, File> files){
		try {
			String BOUNDARY = java.util.UUID.randomUUID().toString();
			String PREFIX = "--", LINEND = "\r\n";
			String MULTIPART_FROM_DATA = "multipart/form-data";
			String CHARSET = "UTF-8";
			Log.i("PostFile", "actionUrl==" + actionUrl);
			URL uri = new URL(actionUrl);
			HttpURLConnection conn = (HttpURLConnection) uri.openConnection();
			conn.setReadTimeout(20 * 1000); // 缓存的最长时间
			conn.setConnectTimeout(60 * 1000);// 连接超时
			conn.setDoInput(true);// 允许输入
			conn.setDoOutput(true);// 允许输出
			conn.setUseCaches(false); // 不允许使用缓存
			conn.setRequestMethod("POST");
			conn.setRequestProperty("connection", "keep-alive");
			conn.setRequestProperty("Charsert", "UTF-8");
			conn.setRequestProperty("Content-Type", MULTIPART_FROM_DATA
					+ ";boundary=" + BOUNDARY);
			// 首先组拼文本类型的参数
			StringBuilder sb = new StringBuilder();
			for (Map.Entry<String, String> entry : params.entrySet()) {
				sb.append(PREFIX);
				sb.append(BOUNDARY);
				sb.append(LINEND);
				sb.append("Content-Disposition: form-data; name=\""
						+ entry.getKey() + "\"" + LINEND);
				sb.append("Content-Type: text/plain; charset=" + CHARSET + LINEND);
				sb.append("Content-Transfer-Encoding: 8bit" + LINEND);
				sb.append(LINEND);
				sb.append(entry.getValue());
				sb.append(LINEND);
			}
			DataOutputStream outStream = new DataOutputStream(
					conn.getOutputStream());
			outStream.write(sb.toString().getBytes());
			// 发送文件数据
			if (files != null){
				for (Map.Entry<String, File> file : files.entrySet()) {
					StringBuilder sb1 = new StringBuilder();
					sb1.append(PREFIX);
					sb1.append(BOUNDARY);
					sb1.append(LINEND);
					sb1.append("Content-Disposition: form-data; name=\"" + file.getKey() + "\"; filename=\""
							+ params.get("fileInputFileName") + "\"" + LINEND);
					sb1.append("Content-Type: application/octet-stream; charset="
							+ CHARSET + LINEND);
					sb1.append(LINEND);
					outStream.write(sb1.toString().getBytes());
					InputStream is = new FileInputStream(file.getValue());
					byte[] buffer = new byte[1024];
					int len = 0;
					while ((len = is.read(buffer)) != -1) {
						outStream.write(buffer, 0, len);
					}
					is.close();
					outStream.write(LINEND.getBytes());
				}
			}
			// 请求结束标志־
			byte[] end_data = (PREFIX + BOUNDARY + PREFIX + LINEND).getBytes();
			outStream.write(end_data);
			outStream.flush();
			// 得到响应码
			int res = conn.getResponseCode();
			Log.i("PostFile", "res==" + res);
			StringBuilder sb2 = new StringBuilder();
			InputStream in = null;
			if (res == 200) {
				in = conn.getInputStream();
				InputStreamReader isr = new InputStreamReader(in, "utf-8");
				BufferedReader br = new BufferedReader(isr);
				String message = null;
				while ((message = br.readLine()) != null) {
					sb2.append(message);
				}
				callBack.onSuccess(sb2);
			}else if (res == 0){
				callBack.onFailure(UIHelper.HTTP_CODE_TIMEOUT,"链接超时");
			}else {
				callBack.onFailure(UIHelper.HTTP_CODE_ERROR,"网络请求失败");
			}
			outStream.close();
			conn.disconnect();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
			callBack.onFailure(UIHelper.HTTP_CODE_ERROR,e.getMessage());
		} catch (ProtocolException e) {
			e.printStackTrace();
			callBack.onFailure(UIHelper.HTTP_CODE_ERROR,e.getMessage());
		} catch (MalformedURLException e) {
			e.printStackTrace();
			callBack.onFailure(UIHelper.HTTP_CODE_ERROR,e.getMessage());
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
			callBack.onFailure(UIHelper.HTTP_CODE_ERROR,e.getMessage());
		} catch (SocketTimeoutException e) {
			e.printStackTrace();
			callBack.onFailure(UIHelper.HTTP_CODE_TIMEOUT,e.getMessage());
		} catch (IOException e) {
			if (e instanceof ConnectException){
				callBack.onFailure(UIHelper.HTTP_CODE_TIMEOUT,e.getMessage());
			}else {
				callBack.onFailure(UIHelper.HTTP_CODE_ERROR,e.getMessage());
			}
			e.printStackTrace();
		}
	}

}
